GO
循环语句命令常用于重复执行一条指令或一组指令,直到条件不再满足时停止,Shell脚本语言的循环语句常见的有while
、until
、for
及select
循环语句。
while循环语句主要用来重复执行一组命令或语句,在企业实际应用中,常用于守护进程或持续运行的程序,除此之外,大多数循环都会用for循环语句。
1. 当型和直到型循环语法
1.1. while循环语句
while循环语句的基本语法为:
提示:注意代码缩进
while循环语句会对紧跟在while命令后的条件表达式进行判断,如果该条件表达式成立,则执行while循环体里的命令或语句(即语法中do和done之间的指令),每一次执行到done时就会重新判断while条件表达式是否成立,直到条件表达式不成立时才会跳出while循环体。如果一开始条件表达式就不成立,那么程序就不会进入循环体中执行命令了。
1.2. until循环语句
until循环语句的语法为:
until循环语句的用法与while循环语句的用法类似,区别是until会在条件表达式不成立时,进入循环执行指令;条件表达式成立时,终止循环。until的应用场景很罕见,所以了解即可,不必深究。
2. 当型和直到型循环的基本范例
首先了解一下Shell中的两个休息命令:
sleep 1
表示休息1秒usleep 1000000
也表示休息1秒
下面是与while和until循环语句相关的示例。
范例1:每隔2秒输出一次系统负载情况
参考答案1:每隔2秒在屏幕上输出一次负载值
123456while truedouptimesleep 2done参考答案2:将负载值追加到log里,使用微秒单位
123456while [ 1 ]douptime >> /tmp/uptime.logusleep 2000000done
通过在脚本的结尾使用&
符号来在后台运行脚本:filename.sh &
。
在实际工作中,一般会通过客户端SSH来连接服务器,因此可能就会有在脚本或命令执行期间不能终端的去求,若终端,则会前功尽弃,更要命的是会破坏系统数据。下面是防止脚本执行中断的几个可行方法:
- 使用
sh filename.sh &
命令,即用&
在后台运行脚本 - 使用
nohup filename.sh &
命令,即使用nohup
加&
在后台运行脚本 - 利用
screen
保持会话,然后再执行命令或脚本,即使用screen
保持当前会话状态。
3. 让Shell脚本在后台运行的知识
有关脚本运行的相关用法和说明见下表
用法 | 说明 |
---|---|
sh *.sh & |
把脚本放到后台执行(在后台运行脚本时常用的方法) |
Ctrl+c |
停止执行当前脚本或任务 |
Ctrl+z |
暂停执行当前脚本或任务 |
bg |
把当前脚本或任务放到后台执行,bg可以理解为background |
fg |
把当前脚本或任务放到前台执行,如果有多个任务,可以使用fg加任务编号调处对应的脚本任务,如fg 2 ,是指调处第二个脚本任务,fg可以理解为frontground |
jobs |
查看当前执行到的脚本或任务 |
kill |
关闭执行的脚本任务,即以kill %任务编号 的形式关闭脚本,这个任务编号,可以通过jobs 来获得 |
更多有关进程管理的Linux相关命令如下:
kill
、killall
、pkill
:杀掉进程ps
:查看进程pstree
:显示进程状态树top
:显示进程renice
:改变优先权nohup
:用户退出系统之后继续工作pgrep
:查找匹配条件的进程strace
:跟踪一个进程的系统调用情况ltrace
:跟踪进程调用库函数的情况
4. while循环按行读文件的方式总结
下面是利用while循环来按行读文件的几种常见方式:
采用
exec
读取文件,然后进入while循环处理:123456exec <FILEsum=0while read linedocmddone使用
cat
读取文件内容,然后通过管道进入while循环处理:1234cat FILE_PATH | while read linedocmddone在while循环结尾done处理过输入重定向指定读取的文件:
1234while read linedocmddone<FILE
范例:开发一个Shell脚本实现Linux系统命令cat读文件的基本功能。参考答案如下:
5. 小结
5.1. while循环结构及相关语句综合实践小结
- while循环的特长是执行守护进程,以及实现我们希望循环持续执行不退出的应用,适合用于频率小于1分钟的循环处理,其它的while循环几乎都可以被for循环及定时任务crond功能所替代。
- case语句可以用if语句来替换,而在系统启动脚本时传入少量固定规则字符串的情况下,多用case语句,其他普通判断多用if语句。
- 一句话场景下,if语句、for语句最常用,其次是while(守护进程)、case(服务启动脚本)。
5.2. Shell脚本中各个语句的使用场景
- 条件表达式,用于简短的条件判断及输出(文件是否存在,字符串是否为空等)
- if取值判断,多用于不同值数量较少的情况
- for最常用于正常的循环处理中
- while多用于守护进程、无限循环(要加sleep和usleep控制频率)场景
- case多用于服务启动脚本中,打印菜单可用select语句,不过很少见,一般用cat的here文档方法来替代。
OK